<?php
/**
 * Created by PhpStorm.
 * User: zlkmu
 * Date: 2017/10/17
 * Time: 0:07
 * 专门用于生成管理员牌型的类
 */

    class AdminManager{
        /**
         * @param $niuCount 要创建牛几牌型
         * @return array //返回的发牌结果
         * 此函数可以产生大于等于要生成牛几的牌型，也有可能产生特殊牌型，不做排除
         */
        public static function createPuTongNiu(&$niuNiu, $niuCount)
        {
            //随机取两张连续的牌
            $s = mt_rand(0, count($niuNiu) - 2);

            $paiArray = array_slice($niuNiu, $s, 2);
            array_splice($niuNiu, $s, 2);


            //print_r($paiArray);

            //取第三张牌凑10
            for($i = 0; $i < count($niuNiu); $i++){
                $tempCard = $niuNiu[$i];
                $t = $paiArray[0]->count + $paiArray[1]->count + $tempCard->count;
                if($t % 10 == 0){
                    array_push($paiArray, $tempCard);
                    array_splice($niuNiu, $i, 1);
                    break;
                }
            }

            //随机取第四张牌
            $s = mt_rand(0, count($niuNiu) - 1);
            array_push($paiArray, $niuNiu[$s]);
            array_splice($niuNiu, $s, 1);

            //取最后一张牌，凑点数
            for($i = 0; $i < count($niuNiu); $i++){
                $t = $niuNiu[$i]->count + $paiArray[3]->count;
                if($t % 10 == $niuCount % 10){
                    array_push($paiArray, $niuNiu[$i]);
                    array_splice($niuNiu, $i, 1);
                    break;
                }
            }

            return $paiArray;

        }

        /**
         * 创建同花顺牛的函数
         * @return array 创建的牌型
         */
        public static function createTongHuaShunNiu(&$niuNiu){
            $paiArray = array();
            //取一张开始的牌，最大不能超过10
            for($i = 0; $i < count($niuNiu); $i++){
                $temp = $niuNiu[$i];
                if($temp->num < 11){
                    array_push($paiArray, $niuNiu[$i]);
                    array_splice($niuNiu, $i, 1);
                    break;
                }
            }

            do{
                $j = count($paiArray);
                for($i = 0; $i < count($niuNiu); $i++){
                    //第一种情况，10以下形成同花顺
                    if(($niuNiu[$i]->type == $paiArray[0]->type) && ($niuNiu[$i]->num == $paiArray[$j - 1]->num + 1)){
                        array_push($paiArray, $niuNiu[$i]);
                        array_splice($niuNiu, $i, 1);
                        break;
                    }
                    //第二种情况，10开始的同花顺的情况，必须在取最后一张牌的时候有效
                    if($j == 4){
                        if(($niuNiu[$i]->type == $paiArray[0]->type) && ($paiArray[$j - 1]->num == 13) && ($niuNiu[$i]->num == 1)){
                            array_push($paiArray, $niuNiu[$i]);
                            array_splice($niuNiu, $i, 1);
                            break;
                        }
                    }
                }
            }while(count($paiArray) < 5);
            return $paiArray;
        }

        /**
         * 创建同花牛的函数
         * @return array 创建的牌型
         */
        public static function createTongHuaNiu(&$niuNiu){
            $paiArray = array();
            //取第一张牌的默认花色
            array_push($paiArray, $niuNiu[0]);
            array_splice($niuNiu, 0, 1);

            do{
                for($i = 0; $i < count($niuNiu); $i++){
                    if($niuNiu[$i]->type == $paiArray[0]->type){
                        array_push($paiArray, $niuNiu[$i]);
                        array_splice($niuNiu, $i, 1);
                        break;
                    }
                }
            }while(count($paiArray) < 5);

            return $paiArray;
        }

        /**
         * 创建顺子牛的函数
         * @return array 创建的牌型
         */
        public static function createShunZiNiu(&$niuNiu){
            $paiArray = array();
            //随机产生一个起点
            $s = mt_rand(0, 51);
            array_push($paiArray, $niuNiu[$s]);
            array_splice($niuNiu, $s, 1);

            do{
                $j = count($paiArray);
                for($i = 0; $i < count($niuNiu); $i++){
                    if($paiArray[$j]->num + 1 == $niuNiu[$i]->num){
                        array_push($paiArray, $niuNiu[$i]);
                        array_splice($niuNiu, $i, 1);
                        break;
                    }
                }
            }while(count($paiArray) <= 5);

            return $paiArray;
        }

        /**
         * 创建五小牛的函数
         * @return array 创建的牌型
         */
        public static function createWuXiaoNiu(&$niuNiu){
            $tempArray = array();
            //定义一个只有1-5牌型的数组
            for($i = 1; $i <= 4; $i++){
                for($j = 1; $j <= 5; $j++){
                    array_push($tempArray, $j);
                }
            }
            //产生一个小于等于5，且总和小于等于10的组合
            do{
                shuffle($tempArray);
                for($i = mt_rand(0, 14); $i < count($tempArray) - 5; $i++){
                    $t = array_slice($tempArray, $i, 5);
                    if(array_sum($t) <= 10){
                        break;
                    }
                }
            }while( (count($t) < 5) || (array_sum($t) > 10));

            //从原始牌堆中找到组合对应的牌，这里不考虑花色，只考虑点数
            $paiArray = array();
            do{
                $j = count($paiArray) ;
                for($i = 0; $i < count($niuNiu); $i++){
                    if($niuNiu[$i]->num == $t[$j]){
                        array_push($paiArray, $niuNiu[$i]);
                        array_splice($niuNiu, $i, 1);
                        break;
                    }
                }
            }while(count($paiArray) < 5);

            return $paiArray;

        }

        /**
         * 创建五花牛的函数
         * @return array 创建的牌型
         */
        public static function createWuHuaNiu(&$niuNiu){
            $paiArray = array();
            $start = 0;
            do{
                for($i = $start; $i < count($niuNiu); $i++){
                    if($niuNiu[$i]->num > 10){
                        array_push($paiArray, $niuNiu[$i]);
                        array_splice($niuNiu, $i, 1);
                        $start = $i;
                        break;
                    }
                }

            }while(count($paiArray) < 5);

            return $paiArray;
        }

        /**
         * 创建四花牛的函数
         * @return array 创建的牌型
         */
        public static function createSiHuaNiu(&$niuNiu){
            //先调用创建五花牛的函数，然后随机更改一张牌为牌堆中的第一张10
            $paiArray = self::createWuHuaNiu($niuNiu);

            for($i = 0; $i < count($niuNiu); $i++){
                if($niuNiu[$i]->num == 10){
                    //随机产生一个位置
                    $pos = mt_rand(0, 4);
                    //取出五花牛产生的牌
                    $tempCard = $paiArray[$pos];
                    //更新该位置的牌为当前牌堆中选择的牌，交换回牌堆
                    $paiArray[$pos] = $niuNiu[$i];
                    $niuNiu[$i] = $tempCard;
                    break;
                }
            }

            return $paiArray;
        }

        /**
         * 创建葫芦牛的函数
         * @return array 创建的牌型
         * 此函数有可能产生五花牛，不做排除
         */
        public static function createHuLuNiu(&$niuNiu){
            $paiArray = array();
            //随机产生一个位置，得到三条数据的第一张牌
            $pos = mt_rand(0, count($niuNiu) - 1);
            array_push($paiArray, $niuNiu[$pos]);
            array_splice($niuNiu, $pos, 1);
            //获取另外两张牌
            do{
                for($i = 0; $i < count($niuNiu); $i++){
                    if($niuNiu[$i]->num == $paiArray[0]->num){
                        array_push($paiArray, $niuNiu[$i]);
                        array_splice($niuNiu, $i, 1);
                        break;
                    }
                }
            }while(count($paiArray) < 3 );

            //随机产生另外一对牌的开始点数
            do{
                $pos = mt_rand(0, count($niuNiu) - 1);
                if($niuNiu[$pos]->num != $paiArray[0]->num){
                    array_push($paiArray, $niuNiu[$pos]);
                    array_splice($niuNiu, $pos, 1);
                }
            }while(count($paiArray) < 4);

            //最后从牌堆中找到最后一张牌
            for($i = 0; $i < count($niuNiu); $i++){
                if($niuNiu[$i]->num == $paiArray[3]->num){
                    array_push($paiArray, $niuNiu[$i]);
                    array_splice($niuNiu, $i, 1);
                    break;
                }
            }

            //洗二下返回数组，并返回
            shuffle($paiArray);
            shuffle($paiArray);
            return $paiArray;

        }

        /**
         * 创建炸弹牛的函数
         * @return array 创建的牌型
         * 此函数有可能产生五花牛，不做排除
         */
        public static function createZhaDanNiu(&$niuNiu){
            $paiArray = array();
            //随机产生一个位置，得到炸弹的第一张牌
            $pos = mt_rand(0, count($niuNiu) - 1);
            array_push($paiArray, $niuNiu[$pos]);
            array_splice($niuNiu, $pos, 1);
            //获取另外三张牌
            do{
                for($i = 0; $i < count($niuNiu); $i++){
                    if($niuNiu[$i]->num == $paiArray[0]->num){
                        array_push($paiArray, $niuNiu[$i]);
                        array_splice($niuNiu, $i, 1);
                        break;
                    }
                }
            }while(count($paiArray) < 4 );

            //随机产生最后一张牌
            $pos = mt_rand(0, count($niuNiu) - 1);
            array_push($paiArray, $niuNiu[$pos]);
            array_splice($niuNiu, $pos, 1);

            //洗二下返回数组，并返回
            shuffle($paiArray);
            shuffle($paiArray);
            return $paiArray;


        }
    }


?>